package com.yuw.operator;

import com.sun.prism.j2d.J2DPipeline;

public class TestDriver01 {
    public static void main(String[] args) {
        // java 运算符
        test01();
        System.out.println("--------------------------------------------------------------");
        test02();
        System.out.println("--------------------------------------------------------------");
        test03();
        System.out.println("--------------------------------------------------------------");
        test04();
        System.out.println("--------------------------------------------------------------");
        test05();
    }

    /**
     * 问号表达式-等价于if-else例子
     */
    public static void test05() {
        int score = 59;
        String strGrade = score >= 90 ? "优秀" :
                score >= 80 ? "良好" :
                        score >= 70 ? "中等" :
                                score >= 60 ? "及格" : "不及格";
        System.out.println(score + "分成绩等级是：" + strGrade);
    }

    /**
     * 问号表达式
     */
    public static void test04() {
        int score = 89;
        String strGrade = score >= 90 ? "优秀" : "不优秀";
        System.out.println(score + "分成绩等级是：" + strGrade);
    }

    /**
     * 位移运算
     */
    public static void test03() {
        // 位移运算
        long l0 = 1;
        long l1 = l0 << 3; // 等价于乘以了2的3次方
        long l2 = 1024;
        long l3 = l2 >> 3; // 等价于除以了2的3次方
        long l4 = l2 >>> 3; // 等价于除以了2的3次方  对于负数没有意义

        System.out.println("l1=" + l1);
        System.out.println("l3=" + l3);
        System.out.println("l4=" + l4);
    }

    /**
     * 逻辑短路
     */
    public static void test02() {
        /*
           逻辑与短路：
                有多个连续的与运算时，从左往右，如果遇到一个操作数为false，
                则该操作数之后的其他的与运算不在执行，直接返回表达式结果为false；
            逻辑或短路：
                有多个连续的或运算时，从左往右，如果遇到一个操作数为true，
                则该操作数之后的其他的或运算不再执行，直接返回表达式的结果为true；
         */

        int i1 = 1, i2 = 2, i3 = 3, i4 = 4, i5 = 5, i6 = 6, i7 = 7, i8 = 8;
        // 与短路
        boolean isOk1 = i1++ > i2 && ++i3 >= i4; // false  i1=2 i2=2 i3=3? i4=4
        // 上一行 通过i3 的值有没有发生变化 判定是否短路
        boolean isOk2 = i5++ < i6 || i7++ > i8; //  true   i5=6 i6=6 i7=7? i8=8
        // 上一行 通过i7 的值有没有发生变化 判定是否短路

        System.out.println("i1=" + i1);
        System.out.println("i3=" + i3);
        System.out.println("i5=" + i5);
        System.out.println("i7=" + i7);

    }

    /**
     * java 运算符
     */
    public static void test01() {
        // 算术运算
        int i0 = 12;
        int i1 = 5;
        int i3 = i0 / i1;
        double i4 = i0 / i1; // 因为 i0和i1都是int类型，所以，表达式 i0 / i1 结果为 int类型，结果为 2；然后2转换为double类型，最终结果为2.0
        double i5 = 1.0 * i0 / i1;
        System.out.println("i3=" + i3);
        System.out.println("i4=" + i4);
        System.out.println("i5=" + i5);

        // 位运算【难点】【不做过多要求】
        //位运算操作的数值都是以补码的形式存在的；【★★★】【扩展：什么是补码】
        //计算机中的所有的数都是以补码的形式存在的。
        int ii0 = 1; // 计算机中的数是补码：  0001 （原码） --> 0001 （补码）
        int ii1 = ~ii0; // 针对补码取反：  0001（补码） ~运算--> 1110（补码）
        // 补码需要还原为原码：  1110（补码）--> 1010(原码) -2
        int ii2 = -2;
        int ii3 = ~ii2;

        System.out.println("ii1=" + ii1); // -2
        System.out.println("ii3=" + ii3);

        // 自增自减运算
        int iii0 = 1;
        int iii1 = iii0++;

        int iii2 = 1;
        int iii3 = ++iii2;
        System.out.println("iii0=" + iii0);
        System.out.println("iii2=" + iii2);
        System.out.println("-------------");
        System.out.println("iii1=" + iii1);
        System.out.println("iii3=" + iii3);

        // 比较运算
        //比较运算的表达式结果的数据类型为boolean类型；
        int k0 = 1;
        int k1 = 2;

        boolean kk = k0 > k1;

        // 逻辑运算
        int j0 = 1;
        int j1 = 2;
        int j3 = 4;
        int j4 = 5;

        boolean jj = j0 >= j1 && j3 >= j4; // false
        System.out.println("jj = " + jj);

    }
}
